#!/bin/bash
#####################################
# 检测两台服务器指定目录下的文件一致性
# 需要自定义 dir 和 b_ip 两个变量
# 如果没有配置公钥连接，将提示输入用户密码
#####################################

# 定义颜色变量
RED='\033[0;31m'      # 红色，用于显示删除的文件
YELLOW='\033[1;33m'   # 黄色，用于显示变更的文件
BLUE='\033[0;34m'     # 蓝色，用于显示新增的文件
NC='\033[0m'          # No Color，重置颜色

# 定义变量
dir="/data/web"       # 要检查的本地目录
b_ip="192.168.88.10" # 远程服务器的 IP 地址
log_file="/var/log/file_check.log"  # 日志文件的路径
tmp_a="/tmp/md5_a.txt"  # 存储本地服务器文件 MD5 值的临时文件
tmp_b="/tmp/md5_b.txt"  # 存储远程服务器文件 MD5 值的临时文件

# 创建日志文件，如果文件不存在则创建
touch "$log_file"

# 检查目标目录是否存在
if [ ! -d "$dir" ]; then
    echo -e "$(date) - 目录 $dir 不存在。" | tee -a "$log_file"
    exit 1
fi

# 生成第一台服务器上的文件MD5值并保存到临时文件
find "$dir" -type f -print0 | xargs -0 md5sum > "$tmp_a"
echo -e "$(date) - 本地服务器 $dir 目录的文件MD5值计算完成。" | tee -a "$log_file"

# 在远程服务器上生成文件MD5值，并将结果复制到本地
if ssh "$b_ip" "find '$dir' -type f -print0 | xargs -0 md5sum > /tmp/md5_b.txt"; then
    scp "$b_ip:/tmp/md5_b.txt" "$tmp_b"
    echo -e "$(date) - 从 $b_ip 复制文件MD5值完成。" | tee -a "$log_file"
else
    echo -e "$(date) - 从 $b_ip 获取文件MD5值失败。" | tee -a "$log_file"
    exit 1
fi

# 比对文件MD5值
# 提取本地和远程的文件路径列表
md5_a_files=$(awk '{print $2}' "$tmp_a")
md5_b_files=$(awk '{print $2}' "$tmp_b")

# 对每个文件进行比对
for f in $md5_a_files; do
    if grep -qw "$f" "$tmp_b"; then
        # 文件在两台服务器上都存在，比较MD5值
        md5_a=$(grep -w "$f" "$tmp_a" | awk '{print $1}')
        md5_b=$(grep -w "$f" "$tmp_b" | awk '{print $1}')
        if [ "$md5_a" != "$md5_b" ]; then
            # 文件存在但MD5值不同，表示文件已变更
            echo -e "$(date) - ${YELLOW}$f changed. Local MD5: $md5_a, Remote MD5: $md5_b${NC}" | tee -a "$log_file"
        fi
    else
        # 文件只存在于本地，远程服务器中不存在，表示文件已删除
        echo -e "$(date) - ${RED}$f deleted.${NC}" | tee -a "$log_file"
    fi
done

# 检查第二台服务器上是否有第一台服务器不存在的文件
for f in $md5_b_files; do
    if ! grep -qw "$f" "$tmp_a"; then
        # 文件只存在于远程服务器，表示文件是新增的
        echo -e "$(date) - ${BLUE}$f added.${NC}" | tee -a "$log_file"
    fi
done

# 清理临时文件
rm -f "$tmp_a" "$tmp_b"
echo -e "$(date) - 临时文件已删除。" | tee -a "$log_file"